﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Leiloes;
using System.Collections;

namespace DLGeneric
{
    public class DLLeilao
    {

        //connection string leilao
        string connectionStringLeiloes = Properties.Settings.Default.leilao;

        /// <summary>
        /// Define o ultimo estado do leilao a nivel de comprador/valor 
        /// bem como actualizar a lista de compradores activos
        /// </summary>
        /// <param name="id_leilao"></param>
        /// <param name="id_comprador"></param>
        /// <param name="valor"></param>
        /// <returns></returns>
        public bool adicionarCompradorLeilao(int id_leilao, int id_comprador, double valor)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;

            try
            {
                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("AdicionarCompradorLeilao", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("id_leilao", id_leilao);
                cmd.Parameters.AddWithValue("id_comprador", id_comprador);
                cmd.Parameters.AddWithValue("valor", valor);
                rdr = cmd.ExecuteReader();

                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine("Ocorreu um erro na ligação à BD \n " + e.ToString());

                return false;
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                }
                if (rdr.IsClosed != true) rdr.Close();
            }
        }

        /// <summary>
        /// Estabelece ligação à base de dados para autenticar o cliente
        /// </summary>
        /// <param name="user"></param>
        /// <param name="pass"></param>
        /// <returns>O id do utilizador</returns>
        public string Autenticar(string user, string pass)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;
            string ret = "";

            try
            {
                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("Autenticar", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("user", user);
                cmd.Parameters.AddWithValue("pass", pass);
                rdr = cmd.ExecuteReader();

                rdr.Read();

                ret = rdr["id"].ToString();
            }
            catch (Exception e)
            {
                Console.WriteLine("Ocorreu um erro na ligação à BD \n " + e.ToString());
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                }
                if (rdr.IsClosed != true) rdr.Close();
            }

            return ret;
        }

        /// <summary>
        /// Retorna o detalhe do leilão
        /// </summary>
        /// <param name="id"></param>
        /// <returns>Lista de leilões em que o utilizador não tem atividade</returns>
        public Leilao leilaoDetalhe(int id_leilao)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;
            Leilao leilao = null;

            try
            {

                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("leilaoDetalhe", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("id_leilao", id_leilao);
                rdr = cmd.ExecuteReader();
                rdr.Read();

                leilao = new Leilao();
                leilao.id = int.Parse(rdr["id"].ToString());
                leilao.vendedorID = int.Parse(rdr["id_vendedor"].ToString());
                leilao.nome = rdr["titulo"].ToString();
                leilao.descricaoArtigo = rdr["descricao"].ToString();
                leilao.valorInicial = double.Parse(rdr["valorbase"].ToString());
                leilao.dataInicio = DateTime.Parse(rdr["datainicio"].ToString());
                leilao.ativo = rdr["ativo"].ToString();
                leilao.dataFim = DateTime.Parse(rdr["datafim"].ToString());
                leilao.valorAtual = double.Parse(rdr["valoractual"].ToString());
                leilao.compradorID = int.Parse(rdr["id_comprador"].ToString());

            }
            catch (Exception e)
            {
                Console.WriteLine("ocorreu um erro na ligação à bd \n " + e.ToString());
            }
            finally
            {
                if (conn != null) conn.Close();
                if (rdr.IsClosed != true) rdr.Close();
            }

            return leilao;
        }

        /// <summary>
        /// Marca um leilão como sendo notificado
        /// </summary>
        /// <param name="id_leilao"></param>
        /// <returns></returns>
        public bool marcarComoNotificado(int id_user)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;

            try
            {
                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("marcarComoNotificado", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("id_user", id_user);
                rdr = cmd.ExecuteReader();

                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine("Ocorreu um erro na ligação à BD \n " + e.ToString());
                return false;
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                }
                if (rdr.IsClosed != true) rdr.Close();
            }
        }

        /// <summary>
        /// Inserir novo leilão
        /// </summary>
        /// <param name="leilao"></param>
        /// <returns></returns>
        public int adicionarLeiao(Leilao leilao)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;

            try
            {
                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("[NovoLeilao]", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("id_vendedor", leilao.vendedorID);
                cmd.Parameters.AddWithValue("titulo", leilao.nome);
                cmd.Parameters.AddWithValue("descricao", leilao.descricaoArtigo);
                cmd.Parameters.AddWithValue("valorbase", leilao.valorInicial);
                cmd.Parameters.AddWithValue("datainicio", leilao.dataInicio);
                cmd.Parameters.AddWithValue("datafim", leilao.dataFim);
                rdr = cmd.ExecuteReader();
                rdr.Read();

                return int.Parse(rdr["id"].ToString());
            }
            catch (Exception e)
            {
                Console.WriteLine("Ocorreu um erro na ligação à BD \n " + e.ToString());
                return -1;
            }
            finally
            {
                if (conn != null) conn.Close();
                if (rdr.IsClosed != true) rdr.Close();
            }
        }

        /// <summary>
        /// Retornar os utilizadores a notificar (compradores e vendedores)
        /// </summary>
        /// <returns> lista de utilizadores por notificar</returns>
        ///
        public ArrayList verificarNotificaoesPendentes(int id_user)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;
            ArrayList lista = new ArrayList();
            Notificar not = null;

            try
            {
                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("utilizadoresPorNotificar", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("id_utilizador", id_user);
                rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    not = new Notificar();
                    not.id_leilao = int.Parse(rdr["id_leilao"].ToString());
                    not.tipo = rdr["tipo"].ToString();
                    not.sucesso = bool.Parse(rdr["sucesso"].ToString());
                    not.titulo = rdr["titulo"].ToString();
                    not.valorfinal = double.Parse(rdr["valorfinal"].ToString());
                    not.id_user = int.Parse(rdr["id_user"].ToString());
                    not.username = rdr["username"].ToString();
                    not.nome = rdr["nome"].ToString();
                    not.email = rdr["email"].ToString();

                    lista.Add(not);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("ocorreu um erro na ligação à bd \n " + e.ToString());
            }
            finally
            {
                if (conn != null) conn.Close();
                if (rdr.IsClosed != true) rdr.Close();
            }
            return lista;
        }

        /// <summary>
        /// Estabelece ligação à bd e mostra qauis os leilões ativos do cliente
        /// </summary>
        /// <param name="id"></param>
        /// <returns>Lista de leilões em que o utilizador não tem atividade</returns>
        public ArrayList verLeiloesDisponiveis(int id_comprador)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;
            ArrayList lista = new ArrayList();
            Leilao leilao = null;
            try
            {

                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("VerLeiloesDisponiveis", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("id_comprador", id_comprador);
                rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    leilao = new Leilao();
                    leilao.id = int.Parse(rdr["id"].ToString());
                    leilao.vendedorID = int.Parse(rdr["id_vendedor"].ToString());
                    leilao.nome = rdr["titulo"].ToString();
                    leilao.descricaoArtigo = rdr["descricao"].ToString();
                    leilao.valorInicial = double.Parse(rdr["valorbase"].ToString());
                    leilao.dataInicio = DateTime.Parse(rdr["datainicio"].ToString());
                    leilao.ativo = rdr["ativo"].ToString();
                    leilao.dataFim = DateTime.Parse(rdr["datafim"].ToString());
                    leilao.valorAtual = double.Parse(rdr["valoractual"].ToString());
                    leilao.compradorID = int.Parse(rdr["id_comprador"].ToString());

                    lista.Add(leilao);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("ocorreu um erro na ligação à bd \n " + e.ToString());
            }
            finally
            {
                if (conn != null) conn.Close();
                if (rdr.IsClosed != true) rdr.Close();
            }

            return lista;
        }

        /// <summary>
        /// Ver Leilões activos / Com actividade do comprador
        /// </summary>
        /// <param name="id"></param>
        /// <returns>Lista de leilões em que o utilizador tem atividade</returns>
        public ArrayList verLeiloesAtivos(int id_comprador)
        {
            SqlConnection conn = null;
            SqlDataReader rdr = null;
            ArrayList lista = new ArrayList();
            Leilao leilao = null;
            try
            {

                conn = new SqlConnection(connectionStringLeiloes);
                conn.Open();
                SqlCommand cmd = new SqlCommand("VerLeiloesAtivos", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("id_comprador", id_comprador);
                rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    leilao = new Leilao();
                    leilao.id = int.Parse(rdr["id"].ToString());
                    leilao.vendedorID = int.Parse(rdr["id_vendedor"].ToString());
                    leilao.nome = rdr["titulo"].ToString();
                    leilao.descricaoArtigo = rdr["descricao"].ToString();
                    leilao.valorInicial = double.Parse(rdr["valorbase"].ToString());
                    leilao.dataInicio = DateTime.Parse(rdr["datainicio"].ToString());
                    leilao.ativo = rdr["ativo"].ToString();
                    leilao.dataFim = DateTime.Parse(rdr["datafim"].ToString());
                    leilao.valorAtual = double.Parse(rdr["valoractual"].ToString());
                    leilao.compradorID = int.Parse(rdr["id_comprador"].ToString());

                    lista.Add(leilao);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("ocorreu um erro na ligação à bd \n " + e.ToString());
            }
            finally
            {
                if (conn != null) conn.Close();
                if (rdr.IsClosed != true) rdr.Close();
            }

            return lista;
        }

    }
}
